/*  
 * ===================================================================  
 *  TS 26.104  
 *  REL-5 V5.4.0 2004-03  
 *  REL-6 V6.1.0 2004-03  
 *  3GPP AMR Floating-point Speech Codec  
 * ===================================================================  
 *  
 */   
   
#include <STDLIB.H>    
#include <STDIO.H>    
#include <MEMORY.H>    
#include "interf_dec.h"    
#include "sp_dec.h"    
#include "typedef.h"    
   
#ifndef ETSI    
#ifndef IF2    
#include <STRING.H>    
#define AMR_MAGIC_NUMBER "#!AMR\n"    
#endif    
#endif    
   
// void Copyright(void){   
// fprintf (stderr,   
// "===================================================================\n"   
// " TS 26.104                                                         \n"   
// " REL-5 V5.4.0 2004-03                                              \n"   
// " REL-6 V6.1.0 2004-03                                              \n"   
// " 3GPP AMR Floating-point Speech Decoder                            \n"   
// "===================================================================\n"   
// );   
// }   
/*  
 * main  
 *  
 *  
 * Function:  
 *    Speech decoder main program  
 *  
 *    Usage: decoder bitstream_file synthesis_file  
 *  
 *    Format for ETSI bitstream file:  
 *       1 word (2-byte) for the TX frame type  
 *       244 words (2-byte) containing 244 bits.  
 *          Bit 0 = 0x0000 and Bit 1 = 0x0001  
 *       1 word (2-byte) for the mode indication  
 *       4 words for future use, currently written as zero  
 *  
 *    Format for 3GPP bitstream file:  
 *       Holds mode information and bits packed to octets.  
 *       Size is from 1 byte to 31 bytes.  
 *  
 *    Format for synthesis_file:  
 *       Speech is written to a 16 bit 8kHz file.  
 *  
 *    ETSI bitstream file format is defined using ETSI as preprocessor  
 *    definition  
 * Returns:  
 *    0  
 */   
int main (int argc, char * argv[]){   
   
   FILE * file_speech, *file_analysis;   
   
   short synth[160];   
   int frames = 0;   
   int * destate;   
   int read_size;   
#ifndef ETSI    
   unsigned char analysis[32];   
   enum Mode dec_mode;   
#ifdef IF2    
   short block_size[16]={ 12, 13, 15, 17, 18, 20, 25, 30, 5, 0, 0, 0, 0, 0, 0, 0 };   
#else    
   char magic[8];   
   short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };   
#endif    
#else    
   short analysis[250];   
#endif    
   
   /* Process command line options */   
   if (argc == 3){   
   
      file_speech = fopen(argv[2], "wb");   
      if (file_speech == NULL){   
         fprintf ( stderr, "%s%s%s\n","Use: ",argv[0], " input.file output.file " );   
         return 1;   
      }   
   
      file_analysis = fopen(argv[1], "rb");   
      if (file_analysis == NULL){   
         fprintf ( stderr, "%s%s%s\n","Use: ",argv[0], " input.file output.file " );   
         fclose(file_speech);   
         return 1;   
      }   
   
   }   
   else {   
      fprintf ( stderr, "%s%s%s\n","Use: ",argv[0], " input.file output.file " );   
      return 1;   
   }   
//    Copyright();   
   /* init decoder */   
   destate = Decoder_Interface_init();   
   
#ifndef ETSI    
#ifndef IF2    
   /* read and verify magic number */   
   fread( magic, sizeof( char ), strlen( AMR_MAGIC_NUMBER ), file_analysis );   
   if ( strncmp( magic, AMR_MAGIC_NUMBER, strlen( AMR_MAGIC_NUMBER ) ) ) {   
       fprintf( stderr, "%s%s\n", "Invalid magic number: ", magic );   
       fclose( file_speech );   
       fclose( file_analysis );   
       return 1;   
   }   
#endif    
#endif    
   
#ifndef ETSI    
   
   /* find mode, read file */   
   while (fread(analysis, sizeof (unsigned char), 1, file_analysis ) > 0)   
   {   
#ifdef IF2    
      dec_mode = analysis[0] & 0x000F;   
#else    
      dec_mode = (analysis[0] >> 3) & 0x000F;   
#endif    
      read_size = block_size[dec_mode];   
   
      fread(&analysis[1], sizeof (char), read_size, file_analysis );   
#else    
   
   read_size = 250;   
   /* read file */   
   while (fread(analysis, sizeof (short), read_size, file_analysis ) > 0)   
   {   
#endif    
   
      frames ++;   
   
      /* call decoder */   
      Decoder_Interface_Decode(destate, analysis, synth, 0);   
   
      fwrite( synth, sizeof (short), 160, file_speech );   
   }   
   
   Decoder_Interface_exit(destate);   
   
   fclose(file_speech);   
   fclose(file_analysis);   
   fprintf ( stderr, "\n%s%i%s\n","Decoded ", frames, " frames.");   
   
   return 0;   
}   
